package com.jie.commonlib.support.eventbus;

import org.greenrobot.eventbus.EventBus;

/**
 *
 * @author ZDST-03
 * @date 2018/2/6
 * EventBus管理器，对EventBus进行基本封装
 */
public class EventBusManager {

    private static EventBusManager instance = null;
    private final EventBus eventBus;

    private EventBusManager(){
        eventBus = EventBus.getDefault();
    }

    public static EventBusManager getInstance() {
        if (instance == null){
            synchronized (EventBusManager.class){
                instance = new EventBusManager();
            }
        }
        return instance;
    }

    public void register(Object object){
        if (!eventBus.isRegistered(object)) {
            eventBus.register(object);
        }
    }

    public void unRegister(Object object){
        if (eventBus.isRegistered(object)) {
            eventBus.unregister(object);
        }
    }

    /**
     * 发生一般事件
     * @param code 事件码
     */
    public void sendEvent(@EventConstant int code){
        sendEvent(new Event(code));
    }

    /**
     * 发送一般事件
     * @param event
     */
    public <T extends Event>  void sendEvent(T event){
        eventBus.post(event);
    }

    /**
     * 发送粘性事件，即发送事件之后, 再订阅该事件也能收到该事件，跟黏性广播类似
     * tip 1：普通事件是先注册，然后发送事件才能收到；而粘性事件，在发送事件之后再订阅该事件也能收到。
     * tip 2：粘性事件会保存在内存中，每次进入都会去内存中查找获取最新的粘性事件，除非你手动解除注册
     * @param event
     */
    public <T extends Event> void sendStickyEvent(T event){
        eventBus.postSticky(event);
    }

    /**
     * 移除粘性事件
     */
    public <T extends Event> void removeStickyEvent(T event){
        eventBus.removeStickyEvent(event);
    }
}
